package com.syp.auth.common.dbrouter.utils;

import java.text.DecimalFormat;

import org.springframework.util.StringUtils;

import com.syp.auth.common.dbrouter.annotation.RouteConstants;
import com.syp.auth.common.dbrouter.bean.DBRule;

public class DBRouterUtils {

	/**
	 * 对分库分表字段哈希后取绝对值
	 * 
	 * @param fieldId
	 * @return
	 */
	public static int getHashValue(String fieldId) {
		return Math.abs(getHashCode(fieldId));
	}

	/**
	 * 用字段哈希后绝对值对总表数取余数，再除每库表数取商数，得到库索引值
	 * 
	 * @param dbRule
	 * @param hashValue
	 * @return
	 */
	public static int getDBIndex(DBRule dbRule, int hashValue) {
		// 总表数 = 总库数 * 每库表数
		int tableCount = dbRule.getDataSourceKeys().size() * dbRule.getTableNumber();
		return (hashValue % tableCount) / dbRule.getTableNumber();
	}

	/**
	 * 用字段哈希后绝对值对每库表数取余数，由于数据源设置是从1开始，所以后面+1操作
	 * 
	 * @param dbRule
	 * @param hashValue
	 * @return
	 */
	public static int getTableIndex(DBRule dbRule, int hashValue) {
		return (hashValue % dbRule.getTableNumber()) + 1;
	}

	/**
	 * 表名称格式化<br>
	 * 例如：tableStyle = _0000，tbIndex = 129，格式化后为：_0129
	 * 
	 * @param tableStyle
	 * @param tbIndex
	 * @return
	 */
	public static String formatTableName(String tableStyle, long tbIndex) {
		String tableIndex;
		DecimalFormat df = new DecimalFormat();
		if (StringUtils.isEmpty(tableStyle)) {
			tableStyle = RouteConstants.DOROUTE_TABLE_STYLE_DEFAULT;
		}
		df.applyPattern(tableStyle);
		tableIndex = df.format(tbIndex);
		return tableIndex;
	}

	/**
	 * 获取字段的哈希值，为避免特殊字符的问题，使用Base64编码后再哈希<br>
	 * 
	 * @param fieldId
	 * @return
	 */
	public static int getHashCode(String fieldId) {
		return fieldId.hashCode();
	}
}
